<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <script>
        // 1、 类的声明
        function Animall() {
            this.name="name";
        }

        /**
         * Es6 中的class声明
         */

        class Animal2{
            constructor (){
                this.name=name;
            }
        }

        /**
         * 实例化
         */
        console.log(new Animall(),new Animal2());

        /**
         *  继承方式
         *  1、借助构造函数
         */
        function Parent1() {
            this.name="parent1";
        }
         // 这种方法不会继承父类原型对象上的方法
        Parent1.prototype.say=function () {}
        function Child1() {
            // call apply 他们改变的是函数运行的上下文
            Parent1.call(this);
            this.type="child1";
        }
        console.log(new Child1());

        /**
         *弥补构造函数的不足，原型链继承
         */
        function Parent2() {
            this.name="parent2";
            this.play=[1,2,3];
        }
        function Child2() {
            this.type="child2";
        }
        Child2.prototype=new Parent2();
        console.log(new Child2());
        console.log(new Child2().__proto__);
        var s1=new Child2();
        var s2=new Child2();
        console.log(s1.play,s2.play);

        s1.play.push(4);

        /**
         * 第三种 组合方式
         */
        function Parent3() {
            this.name="parent3";
            this.play=[1,2,3];
        }
        function Child3() {
            Parent3.call(this);
            this.type="child3";
        }

        Child3.prototype=new Parent3();

        var s3=new Child3();
        var s4=new Child3();
        s3.play.push(4);
        console.log(s3.play,s4.play);

        /**
         * 第三种的优化
         */
        function Parent4() {
            this.name="parent4";
            this.play=[1,2,3];
        }
        function Child4() {
            Parent3.call(this);
            this.type="child4";
        }

        Child4.prototype=Parent4.prototype;

        var s5=new Child4();
        var s6=new Child4();
        s5.play.push(4);
        console.log(s5.play,s6.play);

        console.log(s5 instanceof Child4,s5 instanceof Parent4);
        console.log(s5.__proto__);

        /**
         * 第三种的优化2
         */
        function Parent5() {
            this.name="parent5";
            this.play=[1,2,3];
        }
        function Child5() {
            Parent5.call(this);
            this.type="child5";
        }
        // 创建中间对象 Object.create创建的原型对象 就是参数
        Child5.prototype=Object.create(Parent5.prototype);
        Child5.prototype.constructor=Child5;

        var s7=new Child5();
        var s8=new Child5();

        console.log(s7 instanceof Child5,s7 instanceof Parent5)
        console.log(s7)
        console.log(s7.constructor);
        console.log(s7.__proto__,s8.__proto__);
    </script>
</body>
</html>